﻿using System;
using System.Resources;
using System.Reflection;
using System.Xml;


namespace Localizer
{
	public class Resources
	{
		private static ResourceManager resourceManager;
		private static object lockFlag = new object();

		/// <summary>
		/// Конструктор делаем private для предотвращения создания экземпляров
		/// </summary>
		private Resources()
		{
		}

		/// <summary>
		/// Возвращает ресурсную строку по имени
		/// </summary>
		/// <param name="name">имя ресурса</param>
		/// <returns>ресурсная строка с заданным именем, или null, если ресурс с таким именем не найден</returns>
		public static string GetString(string name)
		{
			string val = ResourceManager.GetString(name);
			if (val == null)
			{
				val = name;
			}
			//@val = @val.Replace(@"\\", @"\");
			return val.Replace("\\r", "\r").Replace("\\n", "\n").Replace("\\t", "\t");//.Replace("\\\\", "\\");
		}

		/// <summary>
		/// Возвращает значение строкового ресурса для указанной культуры
		/// </summary>
		/// <param name="name">идентификатор ресурса</param>
		/// <param name="cultureInfo">культура</param>
		/// <returns>значение строкового ресурса для указанной культуры</returns>
		public static string GetString(string name, System.Globalization.CultureInfo cultureInfo)
		{
			string val = ResourceManager.GetString(name, cultureInfo);
			if (val == null)
			{
				val = name;
			}
			//val = val.Replace("\\\\", "\\");
			return val.Replace("\\r", "\r").Replace("\\n", "\n").Replace("\\t", "\t");//.Replace("\\\\", "\\");
		}

		/// <summary>
		/// Возвращает текущего менеджера ресурсов (ResourceManager)
		/// </summary>
		public static ResourceManager ResourceManager
		{
			get
			{
				if (resourceManager == null)
				{
					lock (lockFlag)
					{
						if (resourceManager == null)
						{
							resourceManager =
								new ResourceManager("Localizer.AllResources", Assembly.GetExecutingAssembly());
						}
					}
				}
				return resourceManager;
			}
		}

		/// <summary>
		/// Возвращает ресурс в виде XmlDocument
		/// </summary>
		/// <param name="resourceName">имя ресурса</param>
		/// <returns>xml-документ</returns>
		public static System.Xml.XmlDocument GetXml(string resourceName)
		{
			string nameSpace = Assembly.GetCallingAssembly().GetName().Name;
			XmlDocument xmlResource = new XmlDocument();
			using (System.IO.Stream resourcesStream = Assembly.GetCallingAssembly().GetManifestResourceStream(nameSpace + "." + resourceName))
			{
				xmlResource.Load(resourcesStream);
				resourcesStream.Close();
			}
			return xmlResource;
		}

		/// <summary>
		/// Возвращает ресурс в виде XmlDocument
		/// </summary>
		/// <param name="nameSpace">пространство имен ресурса</param>
		/// <param name="resourceName">имя ресурса</param>
		/// <returns>xml-документ</returns>
		public static System.Xml.XmlDocument GetXml(string nameSpace, string resourceName)
		{
			XmlDocument xmlResource = new XmlDocument();
			using (System.IO.Stream resourcesStream = Assembly.GetCallingAssembly().GetManifestResourceStream(nameSpace + "." + resourceName))
			{
				xmlResource.Load(resourcesStream);
				resourcesStream.Close();
			}
			return xmlResource;
		}
	}
}

